all repos — caroster @ 655de2a956a35bddae072540e09c1ec352d2801b

[Octree] Group carpool to your event https://caroster.io

frontend/pages/api/nauth/[...nextauth].js (view raw)

  1import NextAuth from 'next-auth';
  2import CredentialsProvider from 'next-auth/providers/credentials';
  3import GoogleProvider from 'next-auth/providers/google';
  4
  5const STRAPI_URL = 'http://localhost:1337';
  6
  7const authHandler = NextAuth({
  8  providers: [
  9    CredentialsProvider({
 10      name: 'Strapi',
 11      credentials: {
 12        email: {label: 'Email', type: 'text'},
 13        password: {label: 'Password', type: 'password'},
 14      },
 15      async authorize(credentials, req) {
 16        const response = await fetch(`${STRAPI_URL}/api/auth/local`, {
 17          method: 'POST',
 18          headers: {'Content-Type': 'application/json'},
 19          body: JSON.stringify({
 20            identifier: credentials.email,
 21            password: credentials.password,
 22          }),
 23        });
 24        const data = await response.json();
 25        if (data?.error?.message === 'Your account email is not confirmed')
 26          throw new Error('EmailNotConfirmed');
 27        else if (!data?.jwt) return null;
 28        else {
 29          const {user, jwt} = data;
 30          return {...user, jwt};
 31        }
 32      },
 33    }),
 34    GoogleProvider({
 35      clientId: process.env.GOOGLE_CLIENT_ID,
 36      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
 37    }),
 38  ],
 39  session: {
 40    jwt: true,
 41  },
 42  callbacks: {
 43    jwt: async params => {
 44      const {token, user, account} = params;
 45
 46      // Google Auth
 47      if (account?.provider === 'google') {
 48        const response = await fetch(
 49          `${STRAPI_URL}/api/auth/${account.provider}/callback?access_token=${account?.access_token}`
 50        );
 51        const data = await response.json();
 52
 53        if (data.error) {
 54          console.error(
 55            `Error from Strapi on authentication with Google: `,
 56            data.error
 57          );
 58          throw new Error(data.error?.message || data.error);
 59        }
 60
 61        token.id = data.user.id;
 62        token.jwt = data.jwt;
 63        token.email = data.user.email;
 64        token.username = data.user.firstname;
 65        token.lang = data.user.lang?.toLowerCase();
 66        token.provider = account.provider;
 67        token.userCreatedAt = data.user.createdAt;
 68      }
 69
 70      // Strapi Auth
 71      else if (user) {
 72        token.id = user.id;
 73        token.jwt = user.jwt;
 74        token.email = user.email;
 75        token.username = user.firstname;
 76        token.lang = user.lang?.toLowerCase();
 77        token.provider = account.provider;
 78        token.userCreatedAt = user.createdAt;
 79      }
 80
 81      return token;
 82    },
 83    session: async params => {
 84      const {session, token} = params;
 85      if (session) {
 86        session.token = token;
 87        session.user.name = token.username;
 88        session.user.lang = token.lang;
 89      }
 90      return session;
 91    },
 92  },
 93  pages: {
 94    signIn: '/auth/login',
 95    error: '/auth/login',
 96  },
 97});
 98
 99export default async function handler(...params) {
100  await authHandler(...params);
101}